/**
 * 圆角矩形插件
 * @author Ly
 * @version 1.0a
 */
/**
 * Ly.RoundRect构造函数
 * @param {Object} config 配置信息
 * config = {
	 container : document.body,       // 圆角矩形容器，默认为body
	 width : 300,
	 height : 100,
	 title : '',
	 html : '',
	 titleBackgroundColor : '#D4E6FC'
 * }
 */
Ly.RoundRect = function(config /* Object */) {
	var _this = this;
	
	config = config || {};
	
	this.handler = {
		container       : config.container || document.body,
		win             : null,
		content         : null,
		titleBar        : null,
		buttons         : [],
		systemButtons   : {
			minButton   : null,
			maxButton   : null,
			closeButton : null
		}
	};
	this.config = {
		id                   : Ly.getCount(),                              // 当前实例的唯一标识
		width                : config.width || 0,                          // 窗口宽度
		height               : config.height || 0,                         // 窗口高度
		title                : config.title || '',                         // 标题，为空则不显示
		html                 : config.html || '',                          // 内容
		titleBackgroundColor : config.BackGroundColor || '#D4E6FC',        // 标题背景色
		borderColor          : config.borderColor || '#96C2F1',            // 边框颜色
		backgroundColor      : config.backgroundColor || '#EFF7FF',        // 背景色，除标题之外
		systemMinButton      : config.systemMinButton || false,            // 最小化按钮
		systemMaxButton      : config.systemMaxButton || false,            // 最大化按钮
		systemCloseButton    : config.systemCloseButton || false,          // 创建关闭按钮
		buttons              : config.buttons || [],                       // 按钮数组
		allowDrag            : config.allowDrag || false,                  // 是否允许拖动，默认false
		allowResize          : config.allowResize || false,                // 是否允许手动改变大小，默认false
		events               : config.events || {}                         // 事件列表，主要包含minEvent,maxEvent, closeEvent
	};
	this.private = {
		// 创建主体框架
		createFrame : function() {
			var config  = _this.config,
				handler = _this.handler;
			
			handler.win = Ly.createElement('div', {
				id  : 'ly-roundrect-win-' + config.id,
				cls : 'ly-roundrect-win'
			});
			
			handler.container.appendChild(handler.win);
			
			return this;
		},
		// 创建圆角
		createRounded : function() {
			var config  = _this.config,
				handler = _this.handler;
			
			handler.t1  = Ly.createElement('b', { cls : 'ly-roundrect-t1' });
			handler.t2  = Ly.createElement('b', { cls : 'ly-roundrect-t2' });
			handler.t3  = Ly.createElement('b', { cls : 'ly-roundrect-t3' });
			handler.b1  = Ly.createElement('b', { cls : 'ly-roundrect-b1' });
			handler.b2  = Ly.createElement('b', { cls : 'ly-roundrect-b2' });
			handler.b3  = Ly.createElement('b', { cls : 'ly-roundrect-b3' });
			
			handler.win.insertBefore(handler.t1, handler.titleBar || handler.content);
			handler.win.insertBefore(handler.t2, handler.titleBar || handler.content);
			handler.win.insertBefore(handler.t3, handler.titleBar || handler.content);
			handler.win.appendChild(handler.b3);
			handler.win.appendChild(handler.b2);
			handler.win.appendChild(handler.b1);
			
			return this;
		},
		// 创建标题栏
		createTitleBar : function() {
			var config  = _this.config,
				handler = _this.handler;
			
			handler.titleBar = Ly.createElement('div', {
				id        : 'ly-roundrect-titlebar-' + config.id,
				cls       : 'ly-roundrect-titlebar',
				innerHTML : '<span style="float:left">' + config.title + '</span>'
			});
			
			handler.win.insertBefore(handler.titleBar, handler.content || handler.b3);
			
			config.title && (handler.titleBar.style.display = 'block');
			
			return this;
		},
		// 创建系统按钮
		createSystemButtons : function() {
			var config  = _this.config,
				handler = _this.handler,
				systemButtons = handler.systemButtons;
			
			if (config.systemCloseButton) {
				systemButtons.closeButton = Ly.createElement('div', {
					id  : 'ly-roundrect-system-closebutton-' + config.id,
					cls : 'ly-roundrect-system-closebutton'
				});
				handler.titleBar.appendChild(systemButtons.closeButton);
				Ly.addEvent('onmouseover', function() { this.className = 'ly-roundrect-system-closebutton-mouseover'; }, systemButtons.closeButton);
				Ly.addEvent('onmouseout', function() { this.className = 'ly-roundrect-system-closebutton'; }, systemButtons.closeButton);
			}
			if (config.systemMaxButton) {
				systemButtons.maxButton = Ly.createElement('div', {
					id  : 'ly-roundrect-system-maxbutton-' + config.id,
					cls : 'ly-roundrect-system-maxbutton'
				});
				handler.titleBar.appendChild(systemButtons.maxButton);
				Ly.addEvent('onmouseover', function() { this.className = 'ly-roundrect-system-maxbutton-mouseover'; }, systemButtons.maxButton);
				Ly.addEvent('onmouseout', function() { this.className = 'ly-roundrect-system-maxbutton'; }, systemButtons.maxButton);
			}
			if (config.systemMinButton) {
				systemButtons.minButton = Ly.createElement('div', {
					id  : 'ly-roundrect-system-minbutton-' + config.id,
					cls : 'ly-roundrect-system-minbutton'
				});
				handler.titleBar.appendChild(systemButtons.minButton);
				Ly.addEvent('onmouseover', function() { this.className = 'ly-roundrect-system-minbutton-mouseover'; }, systemButtons.minButton);
				Ly.addEvent('onmouseout', function() { this.className = 'ly-roundrect-system-minbutton'; }, systemButtons.minButton);
			}
			return this;
		},
		// 创建主体
		createContent : function() {
			var config  = _this.config,
				handler = _this.handler;
			
			handler.content = Ly.createElement('div', {
				id        : 'ly-roundrect-content-' + config.id,
				cls       : 'ly-roundrect-content',
				innerHTML : config.html
			});
			
			handler.win.insertBefore(handler.content, handler.b3);
			
			return this;
		},
		// 创建按钮栏
		createButtonsBar : function() {
			var config  = _this.config,
				handler = _this.handler;
			
			handler.buttonsBar = Ly.createElement('div', {
				id  : 'ly-roundrect-buttonsbar-' + config.id,
				cls : 'ly-roundrect-buttonsbar'
			});
			
			handler.win.insertBefore(handler.buttonsBar, handler.b3);
			
			if (config.buttons.length) {
				handler.buttonsBar.style.display = 'block';
			}
			
			return this;
		},
		// 创建按钮
		createButtons : function() {
			var config  = _this.config,
				handler = _this.handler,
				buttons = config.buttons;
			
			for (var i = 0, len = buttons.length; i < len; ++i) {
				handler.buttons.push(Ly.createElement('button', {
					cls       : buttons[i].cls || '',
					innerHTML : buttons[i].name
				}));
				buttons[i].constructor === Function && Ly.addEvent('onclick', buttons[i].fun, handler.buttons[handler.buttons.length -1]);
			}
			
			return this;
		},
		/**
		 * 设置左右边框线颜色
		 * @param {Array} objs 要设置颜色的对象数组
		 * @param {String} color 十六进制颜色
		 */
		setLRBorderColor : function(objs, color) {
			for (var i = 0, len = objs.length; i < len; ++i) {
				objs[i].style.borderLeftColor  = color;
				objs[i].style.borderRightColor = color;
			}
			
			return this;
		},
		/**
		 * 设置背景色
		 * @param {Array} objs 要设置背景颜色的对象数组
		 * @param {String} color 十六进制颜色
		 */
		setBackgroundColor : function(objs, color) {
			for (var i = 0, len = objs.length; i < len; ++i) {
				objs[i].style.backgroundColor = color;
			}
			return this;
		},
		// 设置所有的元素样式
		setStyle : function() {
			var config  = _this.config,
				handler = _this.handler;
			
			// 设置边框颜色
			this.setLRBorderColor([
				handler.t1,       handler.t2,      handler.t3,
				handler.titleBar, handler.content, handler.buttonsBar,
				handler.b1,       handler.b2,      handler.b3
			], config.borderColor)
			.setBackgroundColor([
				handler.t1,       handler.b1
			], config.borderColor)
			.setBackgroundColor([
				handler.t2,       handler.t3,
				handler.content,  handler.buttonsBar,
				handler.b2,       handler.b3
			], config.backgroundColor);
			
			config.title && this.setBackgroundColor([
				handler.t2,       handler.t3,      handler.titleBar
			], config.titleBackgroundColor);
			
			return this;
		},
		// 设置大小
		setSize : function() {
			var config        = _this.config,
				handler       = _this.handler,
				titleHeight   = 18,
				contentHeight = config.height - 4 - 4;
			
			if (config.height) {
				config.title && (handler.titleBar.style.height = titleHeight + 'px',contentHeight -= 25);
				handler.content.style.height = contentHeight + 'px';
			}
			
			config.width && this.setWidth([
				handler.win
			], config.width);
			
			return this;
		},
		setWidth : function(objs, width) {
			for (var i = 0, len = objs.length; i < len; ++i) {
				objs[i].style.width = width + 'px';
			}
			return this;
		},
		// 初始化插件
		initialization : function() {
			this.createFrame().createRounded().createTitleBar().createSystemButtons().createContent().createButtonsBar().createButtons().setStyle().setSize();
			
			return this;
		}
	};
};
Ly.RoundRect.prototype = {
	version : '1.0',
	// 渲染插件
	render : function() {
		this.private.initialization();
		return this;
	},
	// 隐藏插件
	hide : function() {
		this.handler.win.style.display = 'none';
		return this;
	},
	// 显示插件
	show : function() {
		this.handler.win.style.display = 'block';
		return this;
	},
	// 获取所有容器的引用
	getHandler : function() {
		return this.handler;
	},
	/**
	 * 更新内容
	 * @param {String} html 要更新至插件的HTML代码
	 */
	updateHtml : function(html /* String */) {
		this.handler.content = html || '';
		return this;
	},
	remove : function() {
		var config  = _this.config,
			handler = _this.handler;
		
		handler.win.innerHTML = '';
		handler.container.removeChild(handler.win);
		handler.win = null;
	}
};